import java.util.ArrayList;
import java.util.List;

// 子类：学生（继承Person）
public class Student extends Person {
    // private权限：仅本类可访问
    private List<Course> selectedCourses = new ArrayList<>(); // 所选课程列表

    // 子类含参构造：调用父类构造初始化共性属性
    public Student(String studentId, String name, String gender) {
        super(studentId, name, gender); // 必须在子类构造第一行调用super()
    }

    // 学生特有方法：选课
    public void selectCourse(Course course) {
        if (course != null && !selectedCourses.contains(course)) {
            selectedCourses.add(course);
            System.out.println("学生" + super.name + "成功选修课程：" + course.getCourseName());
        } else {
            System.out.println("学生" + super.name + "选修课程失败（课程不存在或已选）");
        }
    }

    // 学生特有方法：退课
    public void dropCourse(Course course) {
        if (course != null && selectedCourses.remove(course)) {
            System.out.println("学生" + super.name + "成功退选课程：" + course.getCourseName());
        } else {
            System.out.println("学生" + super.name + "退课失败（未选修该课程）");
        }
    }

    // 重写父类抽象方法：打印学生选课表（工作单）
    @Override
    public void printWorksheet() {
        System.out.println("\n========== 学生课表 ==========");
        System.out.println("学生ID：" + super.id);
        System.out.println("学生姓名：" + super.name);
        System.out.println("选课数量：" + selectedCourses.size());
        if (!selectedCourses.isEmpty()) {
            System.out.println("课程编号\t课程名称\t上课地点\t上课时间\t授课教师");
            for (Course course : selectedCourses) {
                System.out.println(course.getCourseId() + "\t\t" + 
                                   course.getCourseName() + "\t" + 
                                   course.getLocation() + "\t" + 
                                   course.getTime() + "\t" + 
                                   course.getTeacher().getName());
            }
        }
        System.out.println("==============================");
    }

    // Getter方法：提供子类特有属性的访问接口
    public List<Course> getSelectedCourses() {
        return selectedCourses;
    }
}